/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package beans;

import database_beans.Fajlovi;
import database_beans.Obavestenja;
import database_beans.PlanAngazovanja;
import database_beans.Predmet;
import database_beans.Zaposleni;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.primefaces.event.FileUploadEvent;
import server.Log;
import server.Util;

/**
 *
 * @author stefan
 */
@ManagedBean(name = "obvsCtrl")
@ViewScoped
public class ZaposleniObavestenjaControler implements Serializable {

    @ManagedProperty("#{userBean}")
    private UserBean user;

    private ArrayList<Obavestenja> obavestenjaList;

    private Obavestenja novoObavestenje;

    private Obavestenja selectedObavestenje;

    private String selectedObavestenjeString;

    private ArrayList<Predmet> predmetiList;

    private String selectedPredmetString;

    private Predmet predmet;

    private String kategorija;

    private String[] kategorije = {"Posao", "Praksa", "Vesti"};

    private Fajlovi file;

    private HashSet<Fajlovi> uploadObavestenja;

    private ArrayList<Fajlovi> obavestenjaFajlovi;

    private Obavestenja obavestenje;
    private boolean imaPredmet;

    /**
     * Creates a new instance of ZaposleniObavestenjaControler
     */
    public ZaposleniObavestenjaControler() {
    }

    @PostConstruct
    public void init() {
        //Session 
        Zaposleni z = user.getZaposleni();
        predmetiList = toList(z);
        novoObavestenje = new Obavestenja();
        //obavestenje = new Obavestenja();
        selectedObavestenje = new Obavestenja();
    }

    public ArrayList<Predmet> toList(Zaposleni z) {
        if (z == null) {
            return null;
        }
        ArrayList<Predmet> list = new ArrayList<Predmet>();
        for (PlanAngazovanja p : new ArrayList<PlanAngazovanja>(z.getPlanAngazovanjas())) {
            list.add(p.getPredmet());
        }
        for (Predmet p : list) {
            Hibernate.initialize(p.getObavestenjas());
        }
        return list;
    }

    public UserBean getUser() {
        return user;
    }

    public void setUser(UserBean user) {
        this.user = user;
    }

    public ArrayList<Obavestenja> getObavestenjaList() {
        return obavestenjaList;
    }

    public void setObavestenjaList(ArrayList<Obavestenja> obavestenjaList) {
        this.obavestenjaList = obavestenjaList;
    }

    public Obavestenja getNovoObavestenje() {
        return novoObavestenje;
    }

    public void setNovoObavestenje(Obavestenja novoObavestenje) {
        this.novoObavestenje = novoObavestenje;
    }

    public Obavestenja getSelectedObavestenje() {
        return selectedObavestenje;
    }

    public void setSelectedObavestenje(Obavestenja selectedObavestenje) {
        this.selectedObavestenje = selectedObavestenje;
    }

    public String getSelectedObavestenjeString() {
        return selectedObavestenjeString;
    }

    public void setSelectedObavestenjeString(String selectedObavestenjeString) {
        this.selectedObavestenjeString = selectedObavestenjeString;
    }

    public ArrayList<Predmet> getPredmetiList() {
        return predmetiList;
    }

    public void setPredmetiList(ArrayList<Predmet> predmetiList) {
        this.predmetiList = predmetiList;
    }

    public String getSelectedPredmetString() {
        return selectedPredmetString;
    }

    public void setSelectedPredmetString(String selectedPredmetString) {
        this.selectedPredmetString = selectedPredmetString;
    }

    public Predmet getPredmet() {
        return predmet;
    }

    public void setPredmet(Predmet predmet) {
        this.predmet = predmet;
    }

    public String getKategorija() {
        return kategorija;
    }

    public void setKategorija(String kategorija) {
        this.kategorija = kategorija;
    }

    public String[] getKategorije() {
        return kategorije;
    }

    public void setKategorije(String[] kategorije) {
        this.kategorije = kategorije;
    }

    public ArrayList<Fajlovi> getObavestenjaFajlovi() {
        return obavestenjaFajlovi;
    }

    public void setObavestenjaFajlovi(ArrayList<Fajlovi> obavestenjaFajlovi) {
        this.obavestenjaFajlovi = obavestenjaFajlovi;
    }

    public Obavestenja getObavestenje() {
        return obavestenje;
    }

    public void setObavestenje(Obavestenja obavestenje) {
        this.obavestenje = obavestenje;
    }

    public void onChangePredmet() {
        predmet = new Predmet();
        if (!"".equals(selectedPredmetString)) {
            for (Predmet p : predmetiList) {
                if (selectedPredmetString.equals(p.getNaziv())) {
                    predmet = p;
                    Log.i("Detektovana promena predmeta" + selectedPredmetString);
                    //Hibernate.initialize(p.getObavestenjas());
                    obavestenjaList = new ArrayList<>(predmet.getObavestenjas());
                    imaPredmet = true;
                }
            }
        }
    }

    public void uploadHandler(FileUploadEvent event) {
        Session session = Util.getSesion();
        Transaction t = session.beginTransaction();
        try {
            file = new Fajlovi();
            file.setData(event.getFile().getContents());
            file.setNaziv(event.getFile().getFileName());
            file.setVelicina(event.getFile().getSize() / 1024);
            String fileType = event.getFile().getFileName().substring(event.getFile().getFileName().lastIndexOf(".") + 1);
            file.setTip(fileType);
            file.setDatum(new Date());
            session.save(file);
            t.commit();
            uploadObavestenja.add(file);
            obavestenjaFajlovi.add(file);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Upload uspesan!"));
            Log.i("Upload hendler izvrsen za fajl " + event.getFile().getFileName());
        } catch (Exception e) {
            t.rollback();
            e.printStackTrace();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Greska!!! Upload neuspesan"));
        }
    }

    public void snimiObavestenje() {

        if (imaPredmet) {
            Session session = Util.getSesion();
            Transaction t = session.beginTransaction();
            try {
                novoObavestenje.setKategorija(kategorija);
                novoObavestenje.setPredmet(predmet);
                // novoObavestenje.setFajlovis(uploadObavestenja);
                session.save(novoObavestenje);
                t.commit();
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Obavestenje snimljeno!"));
                novoObavestenje = new Obavestenja();
                predmet = null;
                imaPredmet = false;
            } catch (Exception e) {
                t.rollback();
                e.printStackTrace();
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Greska!!! Obavestenje nije snimljeno!"));
            }
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Morate odabrati predmet i uneti podatke"));
        }
    }

    public void azurirajObavestenje() {

        if (!"".equals(selectedObavestenjeString)) {
            Session session = Util.getSesion();
            Transaction t = session.beginTransaction();
            try {
                selectedObavestenje.setKategorija(kategorija);
                selectedObavestenje.setPredmet(predmet);
                novoObavestenje.setFajlovis(uploadObavestenja);
                session.update(selectedObavestenje);
                t.commit();
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Obavestenje snimljeno!"));

                predmet = null;
                imaPredmet = false;
            } catch (Exception e) {
                t.rollback();
                e.printStackTrace();
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Greska!!! Azuriranje neuspesno!"));
            }
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Morate odabrati predmet"));
        }
    }

    public void onChangeObavestenje() {
        selectedObavestenje = new Obavestenja();
        if (!"".equals(selectedObavestenjeString)) {
            for (Obavestenja ob : obavestenjaList) {
                if (selectedObavestenjeString.equals(ob.getNaslov())) {
                    Hibernate.initialize(ob);
                    selectedObavestenje = ob;
                    uploadObavestenja = new HashSet<>(ob.getFajlovis());
                }
            }
        }
    }

    public void obrisiObavestenje() {
        if (!"".equals(selectedObavestenjeString)) {
            Session session = Util.getSesion();
            Transaction t = session.beginTransaction();
            try {
                session.delete(selectedObavestenje);
                t.commit();
                obavestenjaList.remove(selectedObavestenje);
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Obavestenje obrisano!"));
                selectedObavestenje = new Obavestenja();
                predmet = null;
                imaPredmet = false;
            } catch (Exception e) {
                t.rollback();
                e.printStackTrace();
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Greska!!! Brisanje neuspesno!"));
            }
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Morate odabrati obavestenje!"));
        }
    }
}
